#ifndef WHEEL_TIMER_H
#define WHEEL_TIMER_H

#include "threadPool.h"
/* #define TIMEOUT 10          // 超时时间（秒） */
#define QUEUE_SIZE 60       // 环形队列大小
#define HASH_TABLE_SIZE 1024 // 哈希表大小

// 客户端信息结构体（包含 netfd 和链表指针）
typedef struct client_info_s {
    /* int netfd;                  // 客户端连接信息 */
    conn_info client_conn_info;
    time_t lastTime;            // 最后活跃时间
    struct client_info_s *next; // 链表指针
} client_info_t;

// 哈希表节点
typedef struct hash_node_t {
    int netfd;              // 客户端文件描述符
    int slot;               // 时间轮盘槽位
    struct hash_node_t *next; // 链表指针
} hash_node_t;

// 哈希表结构体
typedef struct hash_table_t {
    hash_node_t *table[HASH_TABLE_SIZE]; // 哈希表数组
} hash_table_t;

// 时间轮盘结构体
typedef struct time_wheel_t {
    client_info_t *wheel[QUEUE_SIZE];  // 环形队列数组
    hash_table_t hash_table;           // 哈希表
    int current_slot;              // 当前槽位
} time_wheel_t;

// 初始化时间轮盘
time_wheel_t *init_wheel();

// 新连接加入时间轮盘
void new_connect(time_wheel_t *tw, client_info_t *client);

// 用户发言，更新客户端活跃时间
void update_client(time_wheel_t *tw, int netfd);

// 客户端主动断开连接，更新时间轮盘
void remove_client(time_wheel_t *tw, int netfd);

// 检查并关闭超时的客户端
/* void check_timeout(time_wheel_t *tw, int epfd); */
void check_timeout(time_wheel_t *tw, int epfd, conn_info *client, int *index);
// 销毁时间轮盘
void destroy_wheel(time_wheel_t *tw);

// 输出时间轮盘中的所有内容
void print_time_wheel(time_wheel_t *tw);

#endif

